Java抽象类(abstract)与三个修饰符(private, static, final) |
您所在的位置:网站首页 › private 类名 › Java抽象类(abstract)与三个修饰符(private, static, final) |
一、抽象类(abstract)
具备某种对象的特征,但不完整。 程序中的抽象类 像是一个模板,供其他类继承使用,但同时定义的一些抽象方法,子类必须实现 无法被实例化,只能被继承类里面的内容和普通类区别在于,它可以些抽象方法里面可以有抽象方法(也可以没有), 抽象方法的作用,是继承该抽象类的类,必须实现这些抽象方法,这就是抽象类的主要作用抽象类头里必须带着abstract,就是说abstract class 类名 //Animal抽象类 public abstract class Animal { String breed; int age; //抽象方法 public abstract void eat(); public abstract void run(); } //继承Animal抽象类 public class Dog extends Animal{ @Override public void eat() { System.out.println("狗在吃"); } @Override public void run() { System.out.println("狗在跑"); } } //如果不吧抽象方法重写完,他会报错普通类:你和我都是类吧 抽象类:嗯,但我不能被实例化,我的作用只是用来继承 普通方法:你说你定义的抽象方法必须被,我找普通方法也可以啊,重写一下方法谁不会啊。 抽象类:但你往往会忘记重写方法,而直接调用父类的方法了,你明明不是狮子却用了狮子类的方法,所以我必须这样规定好,不自己写等着报错吧 1.2 abstract修饰符修饰类里的各种元素 1.2.1修饰类名这是抽象类必须有的,只有abstract修饰过的类名才叫抽象类,才能些抽象方法 public abstract class Animal { } 1.2.2 修饰构造方法抽象类能修饰构造方法吗? 答案是不能 public abstract class Animal { abstract Animal(){ //报错 System.out.println("我是动物"); } } //报错抽象类不能修饰构造方法 1.2.3 修饰成员属性与方法属性 抽象类能修饰属性吗? 不能,很显然修饰属性没有意义。 方法 抽象类主要作用就是抽象方法,抽象方法不能写函数体(不能有内容),继承抽象类的子类必须重写抽象方法 public abstract class Animal { //这就是没有方法体 public abstract void eat(); public abstract void run(); } 1.2.4构造块(了解)abstract不能修饰构造块 总结:(除了开头需要定义为抽象类)abstract只能修饰方法 二、static(静态)static修饰的属性与方法,代表为静态的,是属于类的,而不是属于对象的,在类写完时候就加载完了 静态就是无需实例化即可以使用的,动态是实例化之后才能使用的。 public class Utile { static String name = "静态类"; static void method(){ System.out.println("我是静态方法"); } } public class TestUtile { public static void main(String[] args) { //调用属性 System.out.println(Utile.name); //调用方法 Utile.method(); } } 结果: 静态类 我是静态方法可以看到无需实例化,即可直接调用 调用静态方法 类名.方法名()调用静态属性 类名.属性 2.2静态属性与方法属性 上面说静态属性和方法是属于类的,刚刚就证明了,无需实例化即可使用,但如果我实例化后对他们进行修改呢? 实例化后把上面的静态属性改了 public class TestUtile { public static void main(String[] args) { //实例化类后修改属性 Utile utile = new Utile(); utile.name = "hello world"; //实例化多个Utile类 Utile utile1 = new Utile(); System.out.println(utile1.name); Utile utile2 = new Utile(); System.out.println(utile2.name); } } 结果: hello world hello world可以看到静态改了,后面全部都改了 2.3继承的方法和属性怎么才能使其方法修改呢?继承重写 但事实上,静态方法并没有继承这说法,来看看下面的吧 public class Utile { static String name = "静态类"; static void method(){ System.out.println("我是静态方法"); } } //继承了上面的 public class ChangeUtile extends Utile{ static String name = "继承后的类"; static void method(){ System.out.println("修改后的方法"); } } public class TestUtile { public static void main(String[] args) { Utile.method(); ChangeUtile.method(); System.out.println("---------------------"); System.out.println("Utile.name:"+Utile.name); System.out.println("ChangeUtile.name:"+ChangeUtile.name); } } 结果: 我是静态方法 修改后的方法 --------------------- Utile.name:静态类 ChangeUtile.name:继承后的类可以看到,静态方法和属性没有重写,不会重叠了不会影响父类 但是,如果不取重写 public class demo2 { public static void main(String[] args) { Cat cat = new Cat(); cat.say = "我是猫"; System.out.println(Animal.say); } } class Animal{ static String say = "hello,我是动物"; } class Cat extends Animal{} 结果: 我是猫也就是说,子类继承了父类的static值,子类继承的static改变了,父类的也改变了!!! 2.3静态方法里的结构刚刚上面说了静态方法没有重写这一概念 下面说下静态方法里面的构造 静态方法里不能有未确定的元素 什么样的元素叫不确定元素呢? 因为静态属性和方法是在类存在时候就加载完了,但普通的成员属性和方法是实例化后才加载进去的,所以我们不能吧一个未加载的元素放到静态方法中(重点) public class Demo02 { public static void main(String[] args) { go(); } private static void go() { System.out.println("gogogo"); } }我们经常写的主函数,就是一个一个静态方法,如果我想调用本类里面的一个方法,就要是写成静态方法,同理,我们在静态方法里调用外面的属性,也该是静态属性 三、final(常量)被final修饰的属性一定要被赋值且不能修改 什么样的数是常量呢? 例如pi = 3.14159… public class Demo02 { public static void main(String[] args) { double pi = Math.PI; } }
其意义在于不能被实例化,常用于所有元素都为static静态的类中,由类本身去调用元素 方法与属性:1、private修饰的方法,实例化也是不能直接调用的,需要在类内部使用,如this.方法,2、属性不能在实例化后赋值,所以由set\get方法来给予赋值,函数也是通过第三方函数来调用,可重载。 继承:private修饰的属性与方法等都不能被继承 类:不允许修饰类 private class Test{} 报错! private修饰的构造方法的类,如Math类,不能被继承,里面全是静态方法。 2、staticstatic为静态,被他修饰的属性与方法不需要实例化即可调用,如类名.属性,类名.方法 构造方法:static不允许修饰构造方法 构造块:静态构造块是仅次于静态代码块执行, 在类生成时,会先执行静态属性,再执行静态代码块 方法与属性:1、static修饰的方法和属性都是属于类本身的,也就不需要实例化即可调用,在static修饰值改变后,所有实例化后的属性值都改变 2、static修饰的方法里不能用普通成员属性!static修饰的方法,在类加载的时候是被首 先加载的,实例化后才加载非static内容,所以加载static时 是不能有非static内容的 3、可重载 继承:子类继承了父类的static值,子类继承的static改变了,父类的也改变了!!! static修饰的属性和方法不能重写。 类:类用不了static修饰 调用静态方法尽量不要用引用对象(不用实例化对象的名字调用)如用Math.max()(Math类是不能实例化的) 3、final构造方法:final不能修饰构造方法 构造块:不能修饰构造块 方法与属性:1、final修饰的属性必须在定义时候赋值,不能final int a; 不能实例化后才赋值,是最终 的唯一,是常量 2、final修饰的方法可以调用但继承不能被修改。 3、可被重载 继承:可被继承,但继承的方法和属性都不可被重写,被final修饰的类不能被继承 类:被final修饰的类不能被继承 被final修饰的属性和方法都为不可覆盖(如继承后不能重写) 静态公开唯一的属性为常量,一般应该都是全大写 public static final double PI = 3.14159265…; 问:为何需要将类标记为final ? 这不会破坏面向对象的目的吗? 答:会也不会。将类标记为final主要目的是为了安全。例如String这个类,假使有人继承过,弄一个行为很不一致的版本,就会对于其操作String的程序产生很多问题。 问:如果类已经是final的,再标记final方法是不是很多余? 答:不只是多余,而且多了很多。如果一个类不能被子类化,则它根本就无法被覆盖。如果只是想限制部分的方法不能被覆盖过,那就单独地标记它们的final的就行了。 4、abstract抽象类是一个模板,供其他类使用 构造方法:不能修饰构造方法构造块:不能修饰构造块属性:不能修饰属性方法:修饰的方法不能写代码,为模板作用,只能被子类继承重写继承:1、可以被abstract类继承,继承过去的抽象方法可以选择性重写 2、被普通类继承时,必须重写抽象方法 3、抽象类本身不能实例化类:可被修饰类,但不能被实例化,只能被继承,为模板作用 继承的类需要重写他的抽象方法 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |